﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FTools.Dominio;
using System.Data.SqlClient;
using System.Data;
using System.Data.OleDb;
using System.Collections;
using FTools.Generico;

namespace FTools.Persistencia
{
    class PerPersonaFisica
    {
        static string msg = "";

        //OBTENER PERSONA FISICA
        public PersonaFisica obtenerPersonaFisica(SqlConnection xConexion, SqlTransaction xTransaccion, long xIdPersona)
        {
            PersonaFisica objPersonaFisica = new PersonaFisica();
            DataTable dataTable = new DataTable();

            try
            {
                SqlCommand command = new SqlCommand("select * from PERSONA_FISICA where ID_PERSONA=@IdPersona");

                command.Parameters.AddWithValue("@IdPersona", xIdPersona);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count >= 0)
                {
                    DataRow fila = dataTable.Rows[0];
                    PerIdentificador objPerIdentificador = new PerIdentificador();
                    Identificador objIdentificador = objPerIdentificador.obtenerIdentificador(xConexion, xTransaccion, (long)fila.ItemArray[1]);

                    objPersonaFisica.IdPersona = (long)fila.ItemArray[0];
                    objPersonaFisica.ObjIdentificador = objIdentificador;
                    objPersonaFisica.Documento = (String)fila.ItemArray[2]; objPersonaFisica.Documento = objPersonaFisica.Documento.Trim();
                    objPersonaFisica.Apellido1 = (String)fila.ItemArray[3]; objPersonaFisica.Apellido1 = objPersonaFisica.Apellido1.Trim();
                    objPersonaFisica.Apellido2 = (String)fila.ItemArray[4]; objPersonaFisica.Apellido2 = objPersonaFisica.Apellido2.Trim();
                    objPersonaFisica.Nombre1 = (String)fila.ItemArray[5]; objPersonaFisica.Nombre1 = objPersonaFisica.Nombre1.Trim();
                    objPersonaFisica.Nombre2 = (String)fila.ItemArray[6]; objPersonaFisica.Nombre2 = objPersonaFisica.Nombre2.Trim();
                    objPersonaFisica.FechaNacimiento = (String)fila.ItemArray[7]; objPersonaFisica.FechaNacimiento = FuncionesFecha.formatoFechaDDMMAAAA(objPersonaFisica.FechaNacimiento.Trim());
                    objPersonaFisica.Sexo = (String)fila.ItemArray[8]; objPersonaFisica.Sexo = objPersonaFisica.Sexo.Trim();
                }
                return objPersonaFisica;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //EXISTE PERSONA FISICA
        public Boolean existePersonaFisica(SqlConnection xConexion, SqlTransaction xTransaccion, long xIdPersona)
        {
            DataTable dataTable = new DataTable();

            try
            {
                SqlCommand command = new SqlCommand("select count(*) as EXISTE from PERSONA_FISICA where ID_PERSONA=@IdPersona");

                command.Parameters.AddWithValue("@IdPersona", xIdPersona);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count >= 0)
                {
                    DataRow fila = dataTable.Rows[0];
                    if ((int)fila.ItemArray[0] > 0)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //OBTENER COLECCION PERSONA FISICA
        public ArrayList obtenerColeccionPersonaFisica(SqlConnection xConexion, SqlTransaction xTransaccion)
        {
            SqlDataAdapter dataAdapter;
            DataTable dataTable = new DataTable();
            ArrayList colPersonaFisica = new ArrayList();

            try
            {
                SqlCommand command = new SqlCommand("select * from PERSONA_FISICA");

                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    PersonaFisica objPersonaFisica = new PersonaFisica();
                    DataRow fila = dataTable.Rows[i];
                    PerIdentificador objPerIdentificador = new PerIdentificador();
                    Identificador objIdentificador = objPerIdentificador.obtenerIdentificador(xConexion, xTransaccion, (long)fila.ItemArray[1]);

                    objPersonaFisica.IdPersona = (long)fila.ItemArray[0];
                    objPersonaFisica.ObjIdentificador = objIdentificador;
                    objPersonaFisica.Documento = (String)fila.ItemArray[2]; objPersonaFisica.Documento = objPersonaFisica.Documento.Trim();
                    objPersonaFisica.Apellido1 = (String)fila.ItemArray[3]; objPersonaFisica.Apellido1 = objPersonaFisica.Apellido1.Trim();
                    objPersonaFisica.Apellido2 = (String)fila.ItemArray[4]; objPersonaFisica.Apellido2 = objPersonaFisica.Apellido2.Trim();
                    objPersonaFisica.Nombre1 = (String)fila.ItemArray[5]; objPersonaFisica.Nombre1 = objPersonaFisica.Nombre1.Trim();
                    objPersonaFisica.Nombre2 = (String)fila.ItemArray[6]; objPersonaFisica.Nombre2 = objPersonaFisica.Nombre2.Trim();
                    objPersonaFisica.FechaNacimiento = (String)fila.ItemArray[7]; objPersonaFisica.FechaNacimiento = FuncionesFecha.formatoFechaDDMMAAAA(objPersonaFisica.FechaNacimiento.Trim());
                    objPersonaFisica.Sexo = (String)fila.ItemArray[8]; objPersonaFisica.Sexo = objPersonaFisica.Sexo.Trim();
                    colPersonaFisica.Add(objPersonaFisica);
                }
                return colPersonaFisica;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //OBTENER BUSQUEDA PERSONA FISICA
        public ArrayList obtenerBusquedaPersonaFisica(SqlConnection xConexion, SqlTransaction xTransaccion, String xDocumento, String xApellido1, String xApellido2, String xNombre1, String xNombre2)
        {
            SqlDataAdapter dataAdapter;
            DataTable dataTable = new DataTable();
            ArrayList colPersonaFisica = new ArrayList();

            try
            {
                SqlCommand command = new SqlCommand("select * from PERSONA_FISICA where " +
                                                    "(DOCUMENTO like '%' + @Documento + '%' or @Documento='') and " +
                                                    "(APELLIDO1 like '%' + @Apellido1 + '%' or @Apellido1='') and " +
                                                    "(APELLIDO2 like '%' + @Apellido2 + '%' or @Apellido2='') and " +
                                                    "(NOMBRE1 like '%' + @Nombre1 + '%' or @Nombre1='') and " +
                                                    "(NOMBRE2 like '%' + @Nombre2 + '%' or @Nombre2='')");

                command.Parameters.AddWithValue("@Documento", xDocumento.Trim());
                command.Parameters.AddWithValue("@Apellido1", xApellido1.Trim());
                command.Parameters.AddWithValue("@Apellido2", xApellido2.Trim());
                command.Parameters.AddWithValue("@Nombre1", xNombre1.Trim());
                command.Parameters.AddWithValue("@Nombre2", xNombre2.Trim());

                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    PersonaFisica objPersonaFisica = new PersonaFisica();
                    DataRow fila = dataTable.Rows[i];
                    PerIdentificador objPerIdentificador = new PerIdentificador();
                    Identificador objIdentificador = objPerIdentificador.obtenerIdentificador(xConexion, xTransaccion, (long)fila.ItemArray[1]);

                    objPersonaFisica.IdPersona = (long)fila.ItemArray[0];
                    objPersonaFisica.ObjIdentificador = objIdentificador;
                    objPersonaFisica.Documento = (String)fila.ItemArray[2]; objPersonaFisica.Documento = objPersonaFisica.Documento.Trim();
                    objPersonaFisica.Apellido1 = (String)fila.ItemArray[3]; objPersonaFisica.Apellido1 = objPersonaFisica.Apellido1.Trim();
                    objPersonaFisica.Apellido2 = (String)fila.ItemArray[4]; objPersonaFisica.Apellido2 = objPersonaFisica.Apellido2.Trim();
                    objPersonaFisica.Nombre1 = (String)fila.ItemArray[5]; objPersonaFisica.Nombre1 = objPersonaFisica.Nombre1.Trim();
                    objPersonaFisica.Nombre2 = (String)fila.ItemArray[6]; objPersonaFisica.Nombre2 = objPersonaFisica.Nombre2.Trim();
                    objPersonaFisica.FechaNacimiento = (String)fila.ItemArray[7]; objPersonaFisica.FechaNacimiento = FuncionesFecha.formatoFechaDDMMAAAA(objPersonaFisica.FechaNacimiento.Trim());
                    objPersonaFisica.Sexo = (String)fila.ItemArray[8]; objPersonaFisica.Sexo = objPersonaFisica.Sexo.Trim();
                    colPersonaFisica.Add(objPersonaFisica);
                }
                return colPersonaFisica;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //ALTA PERSONA FISICA
        public int altaPersonaFisica(SqlConnection xConexion, SqlTransaction xTransaccion, PersonaFisica xObjPersonaFisica)
        {
            try
            {
                SqlCommand command = new SqlCommand("insert into PERSONA_FISICA values (@IdPersona, @IdIdentificador, @Documento, @Apellido1, @Apellido2, @Nombre1, @Nombre2, @FechaNacimiento, @Sexo)");

                command.Parameters.AddWithValue("@IdPersona", xObjPersonaFisica.IdPersona);
                command.Parameters.AddWithValue("@IdIdentificador", xObjPersonaFisica.ObjIdentificador.IdIdentificador);
                command.Parameters.AddWithValue("@Documento", xObjPersonaFisica.Documento.Trim());
                command.Parameters.AddWithValue("@Apellido1", xObjPersonaFisica.Apellido1.Trim());
                command.Parameters.AddWithValue("@Apellido2", xObjPersonaFisica.Apellido2.Trim());
                command.Parameters.AddWithValue("@Nombre1", xObjPersonaFisica.Nombre1.Trim());
                command.Parameters.AddWithValue("@Nombre2", xObjPersonaFisica.Nombre2.Trim());
                command.Parameters.AddWithValue("@FechaNacimiento", FuncionesFecha.formatoFechaAAAAMMDD(xObjPersonaFisica.FechaNacimiento.Trim()));
                command.Parameters.AddWithValue("@Sexo", xObjPersonaFisica.Sexo);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //BAJA PERSONA FISICA
        public int bajaPersonaFisica(SqlConnection xConexion, SqlTransaction xTransaccion, PersonaFisica xObjPersonaFisica)
        {
            try
            {
                SqlCommand command = new SqlCommand("delete from PERSONA_FISICA where ID_PERSONA=@IdPersona");

                command.Parameters.AddWithValue("@IdPersona", xObjPersonaFisica.IdPersona);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //MODIFICA PERSONA FISICA
        public int modificaPersonaFisica(SqlConnection xConexion, SqlTransaction xTransaccion, PersonaFisica xObjPersonaFisica)
        {
            try
            {
                SqlCommand command = new SqlCommand("update PERSONA_FISICA set ID_IDENTIFICADOR=@IdIdentificador, DOCUMENTO=@Documento, APELLIDO1=@Apellido1, APELLIDO2=@Apellido2, NOMBRE1=@Nombre1, NOMBRE2=@Nombre2, FECHA_NACIMIENTO=@FechaNacimiento, SEXO=@Sexo " +
                                                    "where ID_PERSONA = @IdPersona");

                command.Parameters.AddWithValue("@IdPersona", xObjPersonaFisica.IdPersona);
                command.Parameters.AddWithValue("@IdIdentificador", xObjPersonaFisica.ObjIdentificador.IdIdentificador);
                command.Parameters.AddWithValue("@Documento", xObjPersonaFisica.Documento.Trim());
                command.Parameters.AddWithValue("@Apellido1", xObjPersonaFisica.Apellido1.Trim());
                command.Parameters.AddWithValue("@Apellido2", xObjPersonaFisica.Apellido2.Trim());
                command.Parameters.AddWithValue("@Nombre1", xObjPersonaFisica.Nombre1.Trim());
                command.Parameters.AddWithValue("@Nombre2", xObjPersonaFisica.Nombre2.Trim());
                command.Parameters.AddWithValue("@FechaNacimiento", FuncionesFecha.formatoFechaAAAAMMDD(xObjPersonaFisica.FechaNacimiento.Trim()));
                command.Parameters.AddWithValue("@Sexo", xObjPersonaFisica.Sexo);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }
    }
}
